<?php
/*
 * Quark PHP Framework
 * Copyright 2011, Sahib Alejandro Jaramillo Leo.
 * http://quarkphp.com/
 * Licensed under the GNU General Public License (http://www.gnu.org/licenses/gpl.html).
 */
/**
 * Definicion de clase View
 * @filesource
 */
/**
 * Clase para configurar y renderear vistas.
 * @author sahib
 */
class View {

	/**
	 * Mapa de variables para bindear en los renderizados de vistas
	 * @access protected
	 * @var array
	 */
	protected $vars_map;

	/**
	 * Instancia de clase Lang, agregada desde el controller con "createInstance"
	 * @see Quark::configEnv()
	 * @var Lang
	 */
	public $Lang;

	/**
	 * Instancia de Css, asignada desde el controller con "createInstance"
	 * @access public
	 * @see Quark::configEnv()
	 * @var Css
	 */
	public $Css;

	/**
	 * Instancia de Js, asignada desde el controller con "createInstance"
	 * @access public
	 * @see Quark::configEnv()
	 * @var Js
	 */
	public $Js;

	/**
	 * Instance de MetaInfo, asignada desde el controller con "createInstance"
	 * @access public
	 * @see Quark::configEnv()
	 * @var MetaInfo
	 */
	public $MetaInfo;

	/**
	 * Instancia de SignedUser
	 * @access public
	 * @see Quark::configEnv()
	 * @var SignedUser
	 */
	public $SignedUser;

	/**
	 * Path donde se encuentran las vistas, por default 'views'
	 * @see View::setPath()
	 * @var string
	 */
	private $path;

	private static $custom_error_view = NULL;

	/**
	 * Constructor
	 * @access public
	 * @param Controller $Controller
	 * @return View
	 */
	public function __construct( Controller $Controller = NULL ) {

		$this->vars_map = array();
		// Mantener referencia entre la vista y el controller.
		$this->Controller = $Controller;
		$this->path = 'views';
	}

	/**
	 * Renderiza la vista especificada por $view
	 * @access public 
	 * @param string $view URI de la vista
	 * @param array $vars variables disponibles en la vista
	 * @param bool $return_render si es TRUE devuelve el render
	 * @return string|View
	 */
	public function render( $view = NULL, $vars = NULL, $return_render = FALSE ) {

		/*
		 * Crear las referencias a los valores de "$this->vars_map" para que todos
		 */
		$vars = (empty( $vars ) ? array() : $vars);
		$this->vars_map = array_merge( $this->vars_map, $vars );
		
		foreach( $this->vars_map as $var_name => $foo )
			$$var_name = &$this->vars_map[$var_name];
		
		// Ruta del archivo de la vista, sin extension, siguiendo el formato de la URL
		$view = (empty( $view ) ? strtolower( Controller::getRunningControllerName( TRUE ) ) . '/' . Controller::getRunningActionName( 
			TRUE ) : $view);
		
		// Configuracion para cargar archivos de lenguaje
		if( Lang::onMultiLangMode( ) )
			$lang_file_path_bak = $this->Lang->setFilePath( $view );
		
		// Ruta complete del archivo de la vista.
		$view_file = $this->path . '/' . $view . '.php';
		
		if( !is_file( $view_file ) )
			trigger_error( 'Vista no encontrada (' . $view_file . ')', E_USER_ERROR );
		else {
			
			// Iniciar buffer para la vista
			ob_start( );
			
			// Crear compatibilidad con short tags si es necesario (code igniter style)
			if( (bool)ini_get( 'short_open_tag' ) === FALSE and Config::get( 'rewrite_short_tags' ) == TRUE )
				echo eval( 
					'?>' . preg_replace( '/<\?=/', '<?php echo ', preg_replace( '/<\?\s+/s', '<?php ', file_get_contents( $view_file ) ) ) );
			else
				require $view_file;
			
		// Devolver el render de la vista.
			if( $return_render ) {
				$bufah = ob_get_contents( );
				ob_end_clean( );
				return $bufah;
			
		// Manda el render de la vista al buffer principal.
			}
			else
				ob_end_flush( );
		}
		
		// Regresar al file path anterior, esto permite renders anidados.
		if( Lang::onMultiLangMode( ) )
			$this->Lang->setFilePath( $lang_file_path_bak );
		
		return $this;
	}

	/**
	 * Establece un nuevo path para las vistas
	 * @param string $new_path nuevo path
	 * @return string viejo path
	 */
	public function setPath( $new_path ) {

		$old_path = $this->path;
		$this->path = kill_slashes( $new_path );
		return $old_path;
	}

	public static function setCustomErrorView( $view ) {

		self::$custom_error_view = $view;
	}

	public static function getCustomErrorView( ) {

		return self::$custom_error_view;
	}
}